package BehavioralPattern.State;


/**
 * @Classname : StateClient
 * @Description : 测试 状态模式
 * 行为型——状态模式
 * 一、模式定义
 *   Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
 *   当一个对象内在状态改变时允许其改变行为，这个对象看起来像改变了其类。
 *   优点：
 *      ① 结构清晰，避免了过多的switch...case或if...else语句的使用，提供系统可维护性；
 *      ② 封装性好，高层模块只调用环境角色，不知道内部状态和行为的变换；
 *      ③ 符合单一职责原则和开闭原则，每个状态都是一个子类，增加状态只需增加一个子类，修改状态也只需修改一个子类。
 *   缺点：
 *      ① 状态太多时会出现状态子类的膨胀。
 * 二、模式类图
 *    https://kdocs.cn/l/cb7BvwCaCE2c
 * 三、适用场景
 *   1、当业务场景中行为随状态改变而改变时
 *   2、程序大量使用switch...case或if...else语句时可使用状态模式替代
 * 四、应用举例
 *   1、业务单据不同状态允许执行不同的操作按钮
 * @Author : chentianyu
 * @Date 2023/3/12 18:12
 */


public class StateClient {
    public static void main(String[] args) {
        System.out.println("------访问者模式------");
        // 定义环境角色并初始化电梯状态
        Context context = new Context();
        context.setLiftState(Context.closedState);
        // 执行动作
        context.open();
        context.run();  // 无效，电梯门开启状态无法执行电梯运行动作
        context.close();
        context.run();
        context.stop();
    }

}

/** 20230312
 * ------访问者模式------
 * 电梯门开启...
 * 电梯门关闭...
 * 电梯运行中...
 * 电梯停止...
 */
